着色器数据类型和精度

在Unity的标准语言HLSL着色器,和一般的用数据类型的支持。然而,Unity有一些增加的HLSL的类型,特别是在移动平台上更好的支持。

基本数据类型

在大多数计算着色器对浮点数进行(这将在常规编程语言如C #浮动)。浮点类型的几种变体:浮、半固定(以及向量/矩阵的变体,如half3和float4x4)。这些类型的精度不同(因此,性能或功耗使用):

高精度: float

最高精度浮点值;一般为32位(就像普通编程语言的浮点)。

全浮点精度一般用于世界空间位置,纹理坐标,或标量的计算涉及复杂的功能如三角或功率/指数。

中等精度: half

中等精度浮点值;一般为16位(范围为60000至60000,精度约为十进制数字的3)。

半精度适用于短矢量、方向、物体空间位置、高动态范围颜色。

低精度: fixed

最低精度不动点值。一般11位,范围为- 2至2和1 /精度。

固定的精度是有用的常规颜色(通常存储在常规纹理),并执行简单的操作。

整数数据类型

整型(int数据类型)经常被用来作为循环计数器或数组索引。为了这个目的,他们通常工作在各种平台。

根据不同的平台,整数类型可能不支持的GPU。例如,Direct3D 9和OpenGL ES 2 GPU只在浮点数据,而看似简单的整数表达式(包括点或逻辑运算)可以进行相当复杂的浮点运算指令。

Direct3D 11, OpenGL ES 3, Metal and other modern platforms have proper support for integer data types, so using bit shifts and bit masking works as expected.

混合成的 vector/matrix 类型

HLSL内置矢量和矩阵是从基本类型创建类型。例如,是一个三维向量float3。X、Y、Z分量,和half4是中等精度4D向量X,Y,Z,W组件。或者,向量可以使用R,G,B,一个颜色组件。

矩阵类型是建立在类似的方式;例如float4x4是4x4变换矩阵。请注意,有些平台只支持方阵,最明显的是OpenGL ES 2。

精度、硬件支持和性能

一个复杂的浮动/一半/固定数据类型使用的是PC GPU总是高精度。这是所有PC(Windows / Mac / Linux)的GPU,不管你写的浮物,在你的着色器或半固定数据类型。他们总是计算所有的32位浮点精度。

半固定类型只能成为有关针对移动GPU,这些类型主要存在功率(有时表现)约束。记住,你需要测试你的着色器的手机看你是否正在运行精度的数值问题。

即使在移动GPU,支持不同精度不同GPU的家庭。这里的每个家庭将每个移动GPU浮点类型的概述(由使用它的比特数表示):

GPU Family float half fixed
PowerVR Series 6/7 32 16
PowerVR SGX 5xx 32 16 11
Qualcomm Adreno 4xx/3xx 32 16
Qualcomm Adreno 2xx 32 vertex 24 fragment
ARM Mali T6xx/7xx 32 16
ARM Mali 400/450 32 vertex 16 fragment
NVIDIA X1 32 16
NVIDIA K1 32
NVIDIA Tegra 3/4 32 16

最现代的移动GPU实际上只支持32位数字(用于浮点型)或16位数字(用于半固定型)。一些老年人有不同的精度为顶点着色器和片段着色器计算。

使用低精度通常可以更快,由于改进的GPU登记分配,或因特殊的“快速通道”的执行单位,某些低精度的数学运算。即使没有原料的性能优势,采用较低的精度通常使用较少的电力在GPU上,导致更好的电池寿命。

一般的经验法则是,除了位置和纹理坐标以外,一切都以半精度开始.。只有提高精度,如果半精度是不够的一些部分的计算。

支持无穷,而且和其他特殊的浮点值

特殊的浮点值的支持可以不同,取决于(主要是手机)你运行的GPU的家庭。

所有的PC GPU支持Direct3D 10支持很好指定的IEEE 754浮点标准。这意味着浮点数的行为与CPU上的常规编程语言完全一样。

移动GPU可以稍有不同程度的支持。在某些情况下,零除以零可能会导致一个NaN(“不是一个数字”),对其他人可能会导致无穷大,零或任何其他未指定的值。确保测试你的着色器目标设备上检查他们的支持。